Fork me on GitHub

2018.5.2 五一假期归来,算法不能停

目前Array标签的easy题做完了,medium的题目做起来真的感到吃力

T.T

Array - 238. Product of Array Except Self( 除自身以外数组的乘积)

题目详情

一个长度为 n 的整形数组nums,其中 n > 1,返回一个数组 output ,其中 output[i] 等于nums中除nums[i]以外所有元素的乘积。

不用除法 且在O(n)内解决这个问题。

Example:

Input: [1,2,3,4]

Output: [24,12,8,6]

思路

  • 比较好的解决方法是构造两个数组相乘:

1.[1, a1, a1 a2, a1 a2 * a3]

2.[a2 a3 a4, a3 * a4, a4, 1]

具体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @param {number[]} nums
* @return {number[]}
*/
var productExceptSelf = function(nums) {
let len = nums.length
let arr = []
let p
arr[0] = p = 1
for(let i = 1; i < len; i++) {
p *= nums[i-1]
arr[i] = p
}
p = 1
for(let i = len - 2; i >=0; i--) {
arr[i] *= p*= nums[i+1]
}
return arr
};

Array - 565. Array Nesting(数组嵌套)

题目详情

索引从0开始长度为N的数组A,包含0到N - 1的所有整数。找到并返回最大的集合S,S[i] = {A[i], A[A[i]], A[A[A[i]]], … }且遵守以下的规则。

假设选择索引为i的元素A[i]为S的第一个元素,S的下一个元素应该是A[A[i]],之后是A[A[A[i]]]… 以此类推,不断添加直到S出现重复的元素。

Example:

Input: A = [5,4,0,3,1,6,2]

Output: 4

Explanation:

A[0] = 5, A[1] = 4, A[2] = 0, A[3] = 3, A[4] = 1, A[5] = 6, A[6] = 2.

其中一种最长的 S[K]:
S[0] = {A[0], A[5], A[6], A[2]} = {5, 6, 2, 0}

思路

  • 按照题意思路去写

具体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @param {number[]} nums
* @return {number}
*/
var arrayNesting = function(nums) {
let maxLen = 0
for(let i = 0, len = nums.length; i < len; i++) {
let curLen = 1,
val = nums[i]
while(Math.abs(val)!=i) {
val = nums[Math.abs(val)]
curLen++
}
maxLen = Math.max(curLen, maxLen)
}
return maxLen
};
-------------本文结束感谢您的阅读-------------
分享